/**  
 * @Title:  ApiLogAspect.java   
 * @Package com.platform.logger.aspect    
 * @author: <a href="mailto:15909910367@163.com">吴先生</a> 
 * @date:   2022年10月28日 下午3:45:57   
 * @version V1.0 
 * @Copyright: 2022 吴先生.
 */
package com.platform.aspect;

import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;

import com.platform.context.SSOUserContext;
import com.platform.logger.annotation.ApiLog;
import com.platform.logger.event.ApiLogEvent;
import com.platform.logger.model.ApiLogModel;
import com.platform.logger.publisher.ApiLogPublisher;

/**
 * @ClassName: ApiLogAspect
 * @Description: api日志切面类 此类在启动类中使用因为在此使用会存在异步线程取值问题
 * @date: 2022年10月28日 下午3:45:57
 * @author: <a href="mailto:15909910367@163.com">吴先生</a>
 * @Copyright: 2022 吴元森.
 */
@Aspect
public class ApiLogAspect {
	
	@Around("@annotation(com.platform.logger.annotation.ApiLog)")
	public Object apiLog(ProceedingJoinPoint point) throws Throwable {
		Signature signature = point.getSignature();
		// 获取类名
		String className = point.getTarget().getClass().getName();
		// 获取方法名
		String methodName = signature.getName();
		// 获取目标方法的ApiLog注解
		MethodSignature methodSignature = (MethodSignature) signature;
		Method method = methodSignature.getMethod();
		ApiLog apiLog = method.getAnnotation(ApiLog.class);
		// 获取注解的value值
		String title = apiLog.value();
		String desc = apiLog.desc();
		long start = System.currentTimeMillis();
		// 执行目标方法
		Object result = point.proceed();
		// 计算接口执行的耗时（毫秒）
		Long time = System.currentTimeMillis() - start;
		// 使用model承载数据
		ApiLogModel apiLogModel = new ApiLogModel();
		apiLogModel.setTitle(title).setDesc(desc).setTime(time)
			.setCreateUser(SSOUserContext.getContext().getUserName())
			.setMethodClass(className).setMethodName(methodName);
		// 发布ApiLogEvent事件
		ApiLogPublisher.event(new ApiLogEvent(apiLogModel)).publish();
		return result;
	}
}
